﻿#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
//if...else...语句
	//int age = 0;
	//scanf("%d", &age);
	//if (age <= 18)
	//	printf("是青少年\n");
	//else if(age < 60)
	//	printf("是成年人\n");
	//else
	//	printf("是老年人\n");
	//默认在 if 和 else 语句中默认都只控制⼀条语句
	//如果我们要if语句同时控制2条及以上语句，那就要使⽤ {} 将代码括起来，else后也可以跟上⼤括号。

//嵌套if
	//在 if else 语句中， else 可以与另⼀个 if 语句连⽤，构成多重判断。
	//要求输入⼀个整数，判断输入的整数是0，还是正数或者负数。
	//int num = 0;
	//scanf("%d", &num);
	//if (num == 0)
	//	printf("输⼊的数字是0\n");
	//else if (num > 0) //这⾥的 if else 语句相当于嵌套在else语句中，形成了嵌套结构 
	//	printf("输⼊的数字是正数\n");
	//else
	//	printf("输⼊的数字是负数\n");

	//输入⼀个整数，如果是正数，再判断是奇数还是偶数，并输出；如果不是正数则输出：非正数。
	//int num = 0;
	//scanf("%d", &num);
	//if (num > 0)
	//{
	//	if (num % 2 == 0)//这⾥的 if else 语句相当于嵌套在if语句中，形成了嵌套结构
	//		printf("偶数\n");
	//	else
	//		printf("奇数\n");
	//}
	//else
	//	printf("非正数\n");

//悬空else问题
	//如果有多个 if 和 else ，可以记住这样⼀条规则， else 总是跟最接近的 if 匹配。
	//int a = 0;
	//int b = 2;
	//if (a == 1)
	//{
	//	if (b == 2)
	//		printf("hehe\n");
	//}
	//else
	//{
	//	printf("haha\n");
	//}

//逻辑操作符：&& ,  || , ！
	//!：逻辑取反运算符（改变单个表达式的真假）。
	//&&：逻辑与运算符，就是并且的意思（两侧的表达式都为真，则为真，否则为假）。
	//||：逻辑或运算符，就是或者的意思（两侧⾄少有⼀个表达式为真，则为真，否则为假）。

//!(逻辑取反运算符)
	//int flag = 0;
	//scanf("%d", &flag);
	//if (flag)  //flag 如果为真，就打印
	//{
	//	printf("hehe\n");
	//}

	//if (!flag) //flag 如果为假，就打印
	//{
	//	printf("hehe\n");

//闰年的判断
	//闰年判断的规则：
	//1. 能被4整除并且不能被100整除是闰年
	//2. 能被400整除是闰年
	//int year = 0;
	//scanf("%d", &year);
	//if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
	//	printf("是闰年\n");

//短路
	//C语⾔“逻辑运算符”还有⼀个特点：
	//它总是先对左侧的表达式求值，再对右边的表达式求值，这个顺序是保证的。
	//如果左边的表达式满⾜逻辑运算符的条件，就不再对右边的表达式求值。这种情况称为“短路”。

	int n  = 0, a = 0, b = 2, c = 3, d = 4;
	//int n = 0, a = 1, b = 2, c = 3, d = 4;
	n = a++ && ++b && d++;
	//n = a++||++b||d++;
	printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);
	//像这种仅仅根据左操作数的结果就能知道整个表达式的结果，
	//不再对右操作数进⾏计算的运算称为短路求值。

//switch 语句
	//除了 if 语句外，C语⾔还提供了 switch 语句来实现分⽀结构。
	//switch 语句是⼀种特殊形式的 if...else 结构，用于判断条件有多个结果的情况。
	//它把多重的 else if 改成更易用、可读性更好的形式。
	//switch (expression) {
	//case value1: statement
	//case value2: statement
	//...
	//default: statement
	//}
	//switch 后的 expression 必须是整型表达式
	//case 后的值，必须是整形常量表达式

//输入任意⼀个整数值，计算除3之后的余数
	//int n = 0;
	//canf("%d", &n);
	//switch (n % 3)
	//{
	//case 0: 
	//	printf("余数为0\n");
	//	break;
	//case 1:
	//	printf("余数为1\n");
	//	break;
	//case 2:
	//	printf("余数为2\n");
	//	break;
	//default:
	//	printf("被除数为负数且不能整除");
	//	break;
	//}
	//注意的点:
	//1. case 和后边的数字之间必须有空格。
	//2. 每⼀个 case 语句中的代码执⾏完成后，需要加上 break ，才能跳出这个switch语句。

	//若满足了其中一个case语句的条件，则会执行该代码。
	//但如果去掉case语句中的break，代码会继续往下执⾏，
	//有可能执⾏其他 case 语句中的代码，直到遇到 break 语句或者 switch 语句结束。

//switch 语句中的default
	//switch 后边的 expression 的结果不是 value1 ，也不是 value2 的时候，就会执⾏default子句。
	//在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序是满⾜实际需求的就可以。
	//不过我们通常是把 default ⼦句放在最后处理的。

//while 循环
	//while (表达式)
	//	语句; //如果循环体想包含更多的语句，可以加上⼤括号
	//⾸先上来就是执⾏判断表达式，表达式的值为0，循环直接结束；
	//表达式的值不为0，则执⾏循环语句，语句执⾏完后再继续判断，是否进⾏下⼀次判断。

	//输入⼀个正的整数，逆序打印这个整数的每⼀位
	//int n = 0;
	//scanf("%d", &n);
	//while (n)
	//{
	//	printf("%d ",n % 10);
	//	n /= 10;
	//}

//for 循环
	//for 循环的语法形式如下：
	//for(表达式1; 表达式2; 表达式3)
	//	语句；//如果循环体想包含更多的语句，可以加上⼤括号 
	//表达式1：⽤于循环变量的初始化
	//表达式2：⽤于循环结束条件的判断
	//表达式3：⽤于循环变量的调整
	//整个循环的过程中，表达式1初始化部分只被执⾏1次，剩下的就是表达式2、循环语句、表达式3在循环。
	
//计算1~100之间3的倍数的数字之和
	//int n = 0;
	//int sum = 0;
	//for (n = 1; n <= 100; n++)
	//{
	//	if (n % 3 == 0)
	//		sum += n;
	//}
	//printf("%d\n", sum);

	//小小的优化 
    //如果能直接产⽣3的倍数的数字就省去了多余的循环和判断
	//int n = 0;
	//int sum = 0;
	//for (n = 3; n <= 100; n += 3)
	//{
	//	sum += n;
	//}
	//printf("%d\n", sum);

//do - while 循环
	//在循环语句中使⽤最少，它的语法如下：
	//do
	//	语句;
	//	while (表达式);

	// while 和 for 这两种循环都是先判断，条件如果满⾜就进入循环，执⾏循环语句，如果不满⾜就跳出循环；
	//⽽ do while 循环则是先直接进入循环体，执⾏循环语句，然后再执⾏ while 后的判断表达式，
	//表达式为真，就会进⾏下⼀次，表达式为假，则不再继续循环。
	//所以在 do while 语句中循环体是⾄少执⾏⼀次的。
    //注意： while 表达式后面需要加个分号。

//输入⼀个正整数，计算这个整数是⼏位数？
    //int sum = 0;
	//scanf("%d", &sum);
	//int cnt = 0;
	//do
	//{
	//	sum /= 10;
	//	cnt++;
	//} while (sum);
	//printf("位数是%d\n", cnt);

//break和continue语句
    //break 的作⽤是⽤于永久的终⽌循环，只要 break 被执⾏，直接就会“跳出循环”，继续往后执⾏。
    //continue 的作⽤是跳过“本次循环”中 continue “后边的代码”，在 for 循环和 while 循环中有所差异的。

//while循环中的 continue 
    //int i = 1;
    //while (i <= 10)
	//{
	//if (i == 5)
	//	continue;
	// //当i等于5后，就执⾏continue，直接跳过 continue 后面的代码，回到循环开始判断的地⽅ 
	// //因为这⾥跳过了i = i+1，所以i⼀直为5，程序陷入死循环 
	//printf("%d ", i); //结果：1 2 3 4然后 i=5 死循环
	//i = i + 1;
	//}
    //如果循环的调整是在 continue 后边的话，可能会造成死循环。

    //如果把循环的调整放到continue之前，则不会出现死循环的情况：
    //int i = 1;
	//while (i <= 10)
	//{
	//i = i + 1;
	//if (i == 5)
	//	continue;
	//printf("%d ", i); //结果：2 3 4 6 7 8 9 10 11
	//}

//for循环中的 continue 
    //int i = 1;
	//for (i = 1; i <= 10; i++)
	//{
	//	if (i == 5)
	//		continue;
	//	printf("%d ", i);
	//}
	//所以在 for 循环中 continue 的作⽤是跳过本次循环中 continue 后的代码，直接去到循环的调整部分。

// do while 语句中的 break 和 continue 的作用和 while 循环中几乎一模一样
	return 0;
}